<?php
/**
 * utilUipackDriverAbstract
 *
 *
 * @package     util
 * @subpackage  Uipack
 * @author      Platform Team
 */

abstract class utilUipackDriverAbstract
{
    /**
     * Sslwrap 객체
     * @var Sslwrap
     */
    private $Sslwrap;

    /**
     * Optimizer 객체
     * @var Optimizer
     */
    protected $Optimizer;

    /**
     * 기본 루트 디렉토리
     * !!WARNING!!
     * 해당 클래스를 상속받아 구현하는 곳에서 ROOT 디렉토리를 오버라이딩 했을때
     * 기존 메소드가 오동작하지 않기 위해 지정된 멤버변수입니다.
     * @var string
     */
    protected $sDefaultRootdir;

    /**
     * 해당 드라이버의 루트 디렉토리
     * @var string
     */
    protected $sRootdir;

    /**
     * 생성자
     *
     * @param Optimizer $Optimizer
     * @param Sslwrap   $Sslwrap
     */
    final public function __construct($Optimizer, $Sslwrap)
    {
        $this->Sslwrap          = $Sslwrap;
        $this->Optimizer        = $Optimizer;
        $this->sDefaultRootdir  = $this->setDefaultRootDir();
        $this->sRootdir         = $this->setRootDir();

        $this->coreCallback();
    }

    /**
     * 해당 UIpack 에서 사용할 기본 루트 디렉토리 지정
     * js, css 계열 메소드에서 기본으로 지정될 루트 디렉토리를 반환시켜준다.
     * !!WARNING!!
     * 프레임워크 레벨에서 지원되는 드라이버에서 사용하기 위해 만들어진 템플릿 메소드입니다.
     * 확장 드라이버의 경우 기존 드라이버의 루트 디렉토리를 동시에 사용해야 하므로, 기존 메소드에서 사용중인
     * 루트 디렉토리에 영향이 가지 않도록 하기 위함입니다.
     *
     * @return string
     */
    protected function setDefaultRootDir() {}

    /**
     * 해당 UIpack 에서 사용할 루트 디렉토리 지정
     * js, css 계열 메소드에서 기본으로 지정될 루트 디렉토리를 반환시켜준다.
     *
     * @return string
     */
    abstract protected function setRootDir();

    /**
     * 코어 콜백 메소드 - 필수 구현
     * (반드시 리턴값에 성공여부를 파악할 수 있도록 boolean 값을 반환하도록 합니다.)
     *
     * @return boolean
     */
    abstract protected function coreCallback();

    /**
     * JS 파일 추가
     *
     * @param string $sPath
     * @param string $sAppendType
     * @return boolean
     */
    protected function js($sPath, $sAppendType=null)
    {
        return $this->Optimizer->addJS($this->sRootdir, $sPath, $sAppendType);
    }

    /**
     * JS 파일 추가 - 원본 옵티마이져 버젼
     *
     * @param string $sRoot
     * @param string $sPath
     * @param string $sAppendType
     * @return boolean
     */
    protected function js_($sRoot, $sPath, $sAppendType=null)
    {
        return $this->Optimizer->addJS($sRoot, $sPath, $sAppendType);
    }

    /**
     * CSS 파일 추가
     *
     * @param string $sPath
     * @param string $sAppendType
     * @return boolean
     */
    protected function css($sPath, $sAppendType=null)
    {
        return $this->Optimizer->addCSS($this->sRootdir, $sPath, $sAppendType);
    }

    /**
     * CSS 파일 추가 - 원본 옵티마이져 버젼
     *
     * @param string $sRoot
     * @param string $sPath
     * @param string $sAppendType
     * @return boolean
     */
    protected function css_($sRoot, $sPath, $sAppendType=null)
    {
        return $this->Optimizer->addCSS($sRoot, $sPath, $sAppendType);
    }

    /**
     * JS 소스 추가
     *
     * @param string $sSource
     * @return boolean
     */
    protected function writeJS($sSource)
    {
        return $this->Optimizer->writeJS($sSource);
    }

    /**
     * CSS 소스 추가
     *
     * @param string $sSource
     * @return boolean
     */
    protected function writeCSS($sSource)
    {
        return $this->Optimizer->writeCSS($sSource);
    }

    /**
     * 외부 URL JS 추가
     *
     * @param string $sUrl
     * @param boolean
     */
    protected function externalJS($sUrl, $sCharset='utf-8')
    {
        return $this->Optimizer->externalJS($sUrl, $sCharset);
    }

    /**
     * 외부 URL CSS 추가
     *
     * @param string $sUrl
     * @param boolean
     */
    protected function externalCSS($sUrl, $sCharset='utf-8')
    {
        return $this->Optimizer->externalCSS($sUrl, $sCharset);
    }

    /**
     * Sslwrap 객체 반환
     *
     * @return Sslwrap
     */
    final protected function sslwrap()
    {
        return $this->Sslwrap;
    }
}
